# -*- coding: utf-8 -*-
# @Time    : 2019/10/15 11:14
# @Author  : LiHaowen
# @Email   : lihaowen2017@163.com
# @File    : class_method.py


class Date:
    # 构造函数
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

    # 实例方法
    def tomorrow(self):
        self.day += 1  # 类变量修改 Date.day += 1

    # 静态方法：数据预处理逻辑可以放入
    # 静态的弊端，硬编码，即类实例化为同名，如果类名字发生改变，则实例化名称需要改变
    @staticmethod
    def parse_from_string(date_str):
        year, month, day = tuple(date_str.split("-"))  # tuple拆包方法
        return Date(int(year), int(month), int(day))

    @staticmethod
    def valid_str(date_str):
        year, month, day = tuple(date_str.split("-"))
        # 判断时间日期是否合规
        if int(year) > 0 and (0 < int(month) <= 12) and (0 < int(day) <= 31):
            return True
        else:
            return False

    # 类方法 参数：类本身
    @classmethod
    def from_string(cls, date_str):
        year, month, day = tuple(date_str.split("-"))
        return cls(int(year), int(month), int(day))

    def __str__(self):
        return "{year}/{month}/{day}".format(year=self.year, month=self.month, day=self.day)


if __name__ == '__main__':
    new_day = Date(2018, 12, 29)
    new_day.tomorrow()  # 实例方法
    print(new_day)

    # 2018-12-31
    # 外部处理数据传递给实例化对象
    date_str = "2018-12-30"
    year, month, day = tuple(date_str.split("-"))  # tuple拆包方法
    new_day = Date(int(year), int(month), int(day))
    new_day.tomorrow()  # 实例方法
    print(new_day)

    # 用staticmethod完成初始化
    # 静态方法属于Date的作用域
    date_str = "2018-12-15"
    new_day = Date.parse_from_string(date_str)  # 静态方法使用
    print(new_day)

    # 用classmethod完成初始化
    date_str = "2018-12-10"
    new_day = Date.from_string(date_str)
    print(new_day)

    # staticmethod 使用场景 对预处理数据的校验无需返回数据
    print(Date.valid_str("2018-10-33"))
